필수적인 특성 열을 구성한 후 텐서플로 추정기를 사용 가능하다.
using estimator progress1. 데이터 로드를 위한 입력 함수를 정의
2. 데이터셋을 특성 열로 변환하다.
3. 추정기 객체를 만든다.(사전 준비된 추정기 사용 or 케라스 모델을 추정기로 변환하여 생성)
4. 추정기의 train(), evaluate(), predict() 메서드를 사용
1. 데이터 로드를 위한 입력 함수를 정의데이터를 처리하는 함수이다.
입력 특성과 레이블(정답 MPG 값)을 담은 튜플로 구성된 텐서플로 데이터셋을 반환
특성은 딕셔너리로 구성되어 있어야 하고, 키는 특성 열의 이름
def train_input_fn(df_train, batch_size=8):
df=df_train.copy()
train_x, train_y=df, df.pop('MPG')
dataset=tf.data.Dataset.from_tensor_slices((dict(train_x), train_y))
return dataset.shuffle(1000).repeat().batch(batch_size)
train_input_fn test
ds=train_input_fn(df_train_norm)
batch=next(iter(ds))
print('Keys:', batch[0].keys())
Keys: dict_keys(['Cylinders', 'Displacement', 'Horsepower', 'Weight', 'Acceleration', 'ModelYear', 'Origin'])
print('ModelYear:', batch[0]['ModelYear'])
ModelYear: tf.Tensor([71 75 81 70 75 77 78 72], shape=(8,), dtype=int64)
모델을 훈련한 후, 평가할 때 사용할 테스트 데이터셋을 위한 입력 함수
eval_input_fn
def eval_input_fn(df_test, batch_size=8):
df=df_test.copy()
test_x, test_y=df, df.pop('MPG')
dataset=tf.data.Dataset.from_tensor_slices((dict(test_x), test_y))
return dataset.batch(batch_size)
2. 데이터셋을 특성 열로 변환(Tensorflow Estimator(feature_column) 참조!)
all_feature_columns=(numeric_features+bucketized_features+categorical_indicator_features)
[NumericColumn(key='Cylinders', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Displacement', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Horsepower', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Weight', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), NumericColumn(key='Acceleration', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), BucketizedColumn(source_column=NumericColumn(key='ModelYear', shape=(1,), default_value=None, dtype=tf.float32, normalizer_fn=None), boundaries=(73, 76, 79)), IndicatorColumn(categorical_column=VocabularyListCategoricalColumn(key='Origin', vocabulary_list=(1, 2, 3), dtype=tf.int64, default_value=-1, num_oov_buckets=0))]
3. 추정기 객체 생성
MPG 값을 예측하는 것은 전형적인 회귀 문제이기 때문에 DNNRegressor 추정기를 생성
추정기를 생성할 때, 특성 열의 리스트와 은닉층의 은닉 유닛 개수를 hidden_units 매개변수에 지정
2개의 은닉층(1층 32개, 2층 10개 유닛)
regressor=tf.estimator.DNNRegressor(
feature_columns=all_feature_columns,
hidden_units=[32, 10],
model_dir='/Users/csian/Desktop/CP/data_set/model/automsg-dnnregressor/')
model_dir에 매개변수가 저장된 디렉터리를 지정한다.
(추정기는 훈련하는 동안 자동으로 모델의 체크포인트 파일을 저장한다.)
model_dir에 매개변수를 지정하지 않으면, 랜덤한 임시 폴더를 만들어서 체크 포인트를 저장한다.
리눅스 같은 경우 /tmp/ 데렉터리 안에 랜덤한 폴더를 생성
4. 추정기의 train(), evaluate(), predict() 메서드 사용
train
import numpy as np
EPOCHS=1000
BATCH_SIZE=8
total_steps=EPOCHS*int(np.ceil(len(df_train)/BATCH_SIZE))
print('훈련 스텝:', total_steps)
regressor.train(input_fn=lambda:train_input_fn(df_train_norm, batch_size=BATCH_SIZE), steps=total_steps)
체크포인트에서 load
reloaded_regressor=tf.estimator.DNNRegressor(feature_columns=all_feature_columns, hidden_units=[32, 10], warm_start_from='/Users/csian/Desktop/CP/data_set/model/automsg-dnnregressor/', model_dir='/Users/csian/Desktop/CP/data_set/model/automsg-dnnregressor/')
evaluate
eval_results=reloaded_regressor.evaluate(input_fn=lambda:eval_input_fn(df_test_norm, batch_size=8))
print('평균 손실 {:.4f}'.format(eval_results['average_loss']))
predict
pred_res=regressor.predict(input_fn=lambda:eval_input_fn(df_test_norm, batch_size=8))
print(next(iter(pred_res)))
{'predictions': array([19.951475], dtype=float32)}